{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cad7332e",
   "metadata": {},
   "source": [
    "# Домашнее задание 10\n",
    "\n",
    "Построение выборочных характеристик по выборке\n",
    "\n",
    "## Цель и результат\n",
    "\n",
    "Вы научитесь строить по выборке описательные статистики, дающие наглядное представление\n",
    "об изучаемом количественном признаке.\n",
    "\n",
    "### Задание\n",
    "1.  Найти в интернете любую независимую выборку объёма не менее 100 наблюдений \n",
    "2. Выполнить работу\n",
    "2.1 Вычислить выборочное среднее, выборочную дисперсию, выборочную квантиль (по заданному пользователем уровню квантили);\n",
    "2.2 построить графики выборочной функции распределения, гистограммы и/или ядерной оценки плотности вероятности;\n",
    "2.3 в предположении, что наблюдения имеют нормальное распределение, построить односторонние и двусторонние доверительные интервалы надёжности 0,9 и 0,95 для математического ожидания и дисперсии."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fad1d0af",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.datasets import load_boston\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy import stats\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc744423",
   "metadata": {},
   "source": [
    "В качестве датасета возьмем стандартный датасет стоимость жилья в Бостоне"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7ce4ca9e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _boston_dataset:\n",
      "\n",
      "Boston house prices dataset\n",
      "---------------------------\n",
      "\n",
      "**Data Set Characteristics:**  \n",
      "\n",
      "    :Number of Instances: 506 \n",
      "\n",
      "    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.\n",
      "\n",
      "    :Attribute Information (in order):\n",
      "        - CRIM     per capita crime rate by town\n",
      "        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.\n",
      "        - INDUS    proportion of non-retail business acres per town\n",
      "        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n",
      "        - NOX      nitric oxides concentration (parts per 10 million)\n",
      "        - RM       average number of rooms per dwelling\n",
      "        - AGE      proportion of owner-occupied units built prior to 1940\n",
      "        - DIS      weighted distances to five Boston employment centres\n",
      "        - RAD      index of accessibility to radial highways\n",
      "        - TAX      full-value property-tax rate per $10,000\n",
      "        - PTRATIO  pupil-teacher ratio by town\n",
      "        - B        1000(Bk - 0.63)^2 where Bk is the proportion of black people by town\n",
      "        - LSTAT    % lower status of the population\n",
      "        - MEDV     Median value of owner-occupied homes in $1000's\n",
      "\n",
      "    :Missing Attribute Values: None\n",
      "\n",
      "    :Creator: Harrison, D. and Rubinfeld, D.L.\n",
      "\n",
      "This is a copy of UCI ML housing dataset.\n",
      "https://archive.ics.uci.edu/ml/machine-learning-databases/housing/\n",
      "\n",
      "\n",
      "This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.\n",
      "\n",
      "The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic\n",
      "prices and the demand for clean air', J. Environ. Economics & Management,\n",
      "vol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics\n",
      "...', Wiley, 1980.   N.B. Various transformations are used in the table on\n",
      "pages 244-261 of the latter.\n",
      "\n",
      "The Boston house-price data has been used in many machine learning papers that address regression\n",
      "problems.   \n",
      "     \n",
      ".. topic:: References\n",
      "\n",
      "   - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.\n",
      "   - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "boston = load_boston()\n",
    "print(boston.DESCR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "44985c93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CRIM</th>\n",
       "      <th>ZN</th>\n",
       "      <th>INDUS</th>\n",
       "      <th>CHAS</th>\n",
       "      <th>NOX</th>\n",
       "      <th>RM</th>\n",
       "      <th>AGE</th>\n",
       "      <th>DIS</th>\n",
       "      <th>RAD</th>\n",
       "      <th>TAX</th>\n",
       "      <th>PTRATIO</th>\n",
       "      <th>B</th>\n",
       "      <th>LSTAT</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.00632</td>\n",
       "      <td>18.0</td>\n",
       "      <td>2.31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.538</td>\n",
       "      <td>6.575</td>\n",
       "      <td>65.2</td>\n",
       "      <td>4.0900</td>\n",
       "      <td>1.0</td>\n",
       "      <td>296.0</td>\n",
       "      <td>15.3</td>\n",
       "      <td>396.90</td>\n",
       "      <td>4.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.02731</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.469</td>\n",
       "      <td>6.421</td>\n",
       "      <td>78.9</td>\n",
       "      <td>4.9671</td>\n",
       "      <td>2.0</td>\n",
       "      <td>242.0</td>\n",
       "      <td>17.8</td>\n",
       "      <td>396.90</td>\n",
       "      <td>9.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.02729</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.469</td>\n",
       "      <td>7.185</td>\n",
       "      <td>61.1</td>\n",
       "      <td>4.9671</td>\n",
       "      <td>2.0</td>\n",
       "      <td>242.0</td>\n",
       "      <td>17.8</td>\n",
       "      <td>392.83</td>\n",
       "      <td>4.03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.03237</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.18</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.458</td>\n",
       "      <td>6.998</td>\n",
       "      <td>45.8</td>\n",
       "      <td>6.0622</td>\n",
       "      <td>3.0</td>\n",
       "      <td>222.0</td>\n",
       "      <td>18.7</td>\n",
       "      <td>394.63</td>\n",
       "      <td>2.94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.06905</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.18</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.458</td>\n",
       "      <td>7.147</td>\n",
       "      <td>54.2</td>\n",
       "      <td>6.0622</td>\n",
       "      <td>3.0</td>\n",
       "      <td>222.0</td>\n",
       "      <td>18.7</td>\n",
       "      <td>396.90</td>\n",
       "      <td>5.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>501</th>\n",
       "      <td>0.06263</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.573</td>\n",
       "      <td>6.593</td>\n",
       "      <td>69.1</td>\n",
       "      <td>2.4786</td>\n",
       "      <td>1.0</td>\n",
       "      <td>273.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>391.99</td>\n",
       "      <td>9.67</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>502</th>\n",
       "      <td>0.04527</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.573</td>\n",
       "      <td>6.120</td>\n",
       "      <td>76.7</td>\n",
       "      <td>2.2875</td>\n",
       "      <td>1.0</td>\n",
       "      <td>273.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>396.90</td>\n",
       "      <td>9.08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>503</th>\n",
       "      <td>0.06076</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.573</td>\n",
       "      <td>6.976</td>\n",
       "      <td>91.0</td>\n",
       "      <td>2.1675</td>\n",
       "      <td>1.0</td>\n",
       "      <td>273.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>396.90</td>\n",
       "      <td>5.64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>504</th>\n",
       "      <td>0.10959</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.573</td>\n",
       "      <td>6.794</td>\n",
       "      <td>89.3</td>\n",
       "      <td>2.3889</td>\n",
       "      <td>1.0</td>\n",
       "      <td>273.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>393.45</td>\n",
       "      <td>6.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>505</th>\n",
       "      <td>0.04741</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.573</td>\n",
       "      <td>6.030</td>\n",
       "      <td>80.8</td>\n",
       "      <td>2.5050</td>\n",
       "      <td>1.0</td>\n",
       "      <td>273.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>396.90</td>\n",
       "      <td>7.88</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>506 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        CRIM    ZN  INDUS  CHAS    NOX     RM   AGE     DIS  RAD    TAX  \\\n",
       "0    0.00632  18.0   2.31   0.0  0.538  6.575  65.2  4.0900  1.0  296.0   \n",
       "1    0.02731   0.0   7.07   0.0  0.469  6.421  78.9  4.9671  2.0  242.0   \n",
       "2    0.02729   0.0   7.07   0.0  0.469  7.185  61.1  4.9671  2.0  242.0   \n",
       "3    0.03237   0.0   2.18   0.0  0.458  6.998  45.8  6.0622  3.0  222.0   \n",
       "4    0.06905   0.0   2.18   0.0  0.458  7.147  54.2  6.0622  3.0  222.0   \n",
       "..       ...   ...    ...   ...    ...    ...   ...     ...  ...    ...   \n",
       "501  0.06263   0.0  11.93   0.0  0.573  6.593  69.1  2.4786  1.0  273.0   \n",
       "502  0.04527   0.0  11.93   0.0  0.573  6.120  76.7  2.2875  1.0  273.0   \n",
       "503  0.06076   0.0  11.93   0.0  0.573  6.976  91.0  2.1675  1.0  273.0   \n",
       "504  0.10959   0.0  11.93   0.0  0.573  6.794  89.3  2.3889  1.0  273.0   \n",
       "505  0.04741   0.0  11.93   0.0  0.573  6.030  80.8  2.5050  1.0  273.0   \n",
       "\n",
       "     PTRATIO       B  LSTAT  \n",
       "0       15.3  396.90   4.98  \n",
       "1       17.8  396.90   9.14  \n",
       "2       17.8  392.83   4.03  \n",
       "3       18.7  394.63   2.94  \n",
       "4       18.7  396.90   5.33  \n",
       "..       ...     ...    ...  \n",
       "501     21.0  391.99   9.67  \n",
       "502     21.0  396.90   9.08  \n",
       "503     21.0  396.90   5.64  \n",
       "504     21.0  393.45   6.48  \n",
       "505     21.0  396.90   7.88  \n",
       "\n",
       "[506 rows x 13 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_boston = pd.DataFrame(boston.data, columns=boston.feature_names)\n",
    "df_boston"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "069f4e5c",
   "metadata": {},
   "source": [
    "Будем работать с признаком LSTAT.\n",
    "\n",
    "Найдем выборочные среднее, дисперсию и квантиль с помощью встроенных средств pandas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "96252a62",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выборочное среднее: 12.653063241106723\n",
      "Выборочная дисперсия: 7.141061511348571\n",
      "Выборочная квантиль 0.75: 16.955000000000002\n"
     ]
    }
   ],
   "source": [
    "print(\"Выборочное среднее:\", df_boston['LSTAT'].mean())\n",
    "print(\"Выборочная дисперсия:\", df_boston['LSTAT'].std())\n",
    "print(\"Выборочная квантиль 0.75:\", df_boston['LSTAT'].quantile(0.75))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca1c9892",
   "metadata": {},
   "source": [
    "Найдем выборочные среднее, дисперсию и квантиль с помощью собственных функций"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1b3d4147",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_mean(array):\n",
    "    return sum(array) / len(array)\n",
    "\n",
    "def get_std(array, square=False, degrees_of_freedom=1):\n",
    "    arr_mean = get_mean(array)\n",
    "    if not isinstance(array, np.ndarray):\n",
    "        array = np.array(array)\n",
    "    arr_std = np.sum(np.square(array - arr_mean)) / (len(array) - degrees_of_freedom)\n",
    "    if square:\n",
    "        return arr_std\n",
    "    return np.sqrt(arr_std)\n",
    "\n",
    "def get_quantile(array, quantile=0.5):\n",
    "    len_array = len(array)\n",
    "    array = np.sort(array)\n",
    "    quantile_index = round(len_array*quantile) + 1\n",
    "    return array[quantile_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "12a50941",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выборочное среднее: 12.653063241106723\n",
      "Выборочная дисперсия: 7.14106151134857\n",
      "Выборочная квантиль 0.75: 17.1\n"
     ]
    }
   ],
   "source": [
    "print(\"Выборочное среднее:\", get_mean(df_boston['LSTAT']))\n",
    "print(\"Выборочная дисперсия:\", get_std(df_boston['LSTAT']))\n",
    "print(\"Выборочная квантиль 0.75:\", get_quantile(df_boston['LSTAT'], quantile=0.75))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98c50ac6",
   "metadata": {},
   "source": [
    "### Построим графики выборочной функции распределения, гистограммы и ядерной оценки плотности вероятности"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "327d4959",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_cdf(array):\n",
    "    \"\"\" Печать CDF для произвольного распределения\"\"\"\n",
    "    \n",
    "    x = np.sort(array)\n",
    "    y = 1. * np.arange(len(array)) / (len(array) - 1)\n",
    "    plt.plot(x, y)\n",
    "    plt.xlabel('x')\n",
    "    plt.title(\"Функция распределения\")\n",
    "    plt.grid()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ea6ada68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_cdf(df_boston['LSTAT'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6975db5f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhMAAAEWCAYAAADchhUKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABBwUlEQVR4nO3deXxcddn//9eVfWubpk33nbahUChQ9kVbWWQRWRQUUUFA9PbWW+V2wR3unwv3/eXm1ltF5EYUBYWyg4KCQAVkKymlFEpbuqZtuqVJ27TZc/3+OCcwTTPJJDPJmSTv5+Mxj2TOnPOZ95yZOXPNOZ/5HHN3RERERHoqI+oAIiIi0r+pmBAREZGkqJgQERGRpKiYEBERkaSomBAREZGkqJgQERGRpKiYEBEJmVmBmV1tZtlmdqKZnRh1plQbDI9R+l6XxYSZrTOzOjOrjbl8ry/CiYj0JXffB5wEbAVuAaqiTZR6g+ExDjRmttDMropz25Vm9raZ7TGzrWb2FzMbYmaPx3xmN5lZY8z1W8JlC8Prj8W092bMfC1mVh9z/dvxMmYl+FjOdfe/d+vRi4j0Q+5+WdQZettgeIyDgZm9H/gxcKa7v2ZmJcC5AO5+Vsx8vwM2uvt32zXxUaABOMPMxrp7pbsfGrPcQuBOd7+tqyxJHeYws9+Z2Q9jrj9mZm5mWeH1EjP7rZltNrNqM3sonF4TVjn1YeXTVvVcGt7+4bA6qgkrslkx99F+T8kL4fTrzOw+M7snrNAWm9mcmOWuNbPV4W1vmdkFMbddHub+asy0s8NpPwyvzwuv/yxmnkPCaXfGTLvXzLaY2S4ze9bM3n1iOlh/C9tVfXVmtq6TeerN7PmY2zpcT2b2i5g23cz2hv8/HtPmVTHtnBZ7v2Y2K5ynJmz/wzG35ZvZf5vZ+vAxPh9Oez3mMbS2r2TDHNPD/yeF87273to95nlmttHMvm1mO8Ln/NKY288xs9fMbLeZVZjZde2WP9nMXgjzV5jZ5eH039n+1fleM/OY5Raa2U/M7JXwsT1swZuz7fbjY9p93czmtbvfH1rwDeDdtu2990JGzGuwyswWxLYds47anqsm2/+9dYWZLbfgffQ3M5vcbrnp7XL8Lvx/Srscx1rM6zqc9gMzq4z3Gkxk3XYw3ywz+2f4HLV9w7k85vbT2r1OWs3stJjbP2RmS8L7ecHMDo+5bZ2ZfcuC93G1BduYvPC2eWa2sV2W52NeAxlm9t3w9bvNzH5vZsMSXVft2k24rXDanbGvVTM72MyeNLOdZrbCzC6Oua39tnV6B6/Vq8L/Dwqfi3N74TFebvtvo9ueq3mdzBP7Xh9nZo+Ej/EdM/tsOP2EmPnbf2ueFLb5fLssG9vu18xyzeynFny2bA7/z42Z97zw9bPbgvfcmWb2jXaPoe1z5M0463y/z7M46+fOmOx1Hbz2rrP424STw4x7OlqvCToGeNHdXwNw953ufoe770lw+csI9k4tBS7tYt5OpazPRLgSDm83+Q9AAXAoMAr4HwB3L3b3IuDzBCuiKLzcZWYzgT8BXwFKgceAR80sJ6bdc2OWiT3edx5wL1AC/BF4yMyyw9tWA6cAw4DrgTvNbGzMsu8QrNg2VwHL2z2e7cBZMS/ajuZ5HJgRPt7FwF107ottj4WwomwnA/jXmPUFQGfryd1j2wSYE14/iy6E6+tR4InwMXwJuMvMysJZbgTmAicSrOdvAK3uPie8v7OAzTHPz487uJv/j653rY4BRgLjCZ6XW2My7AU+DRQD5wD/Ymbnh/knETwHPw/XyxHAkph2/ytm3czhQJ8GrgDGAc3A/4btjgf+AvwwfNxfA+43s9KYZY2gii8ieM3H+jfgfOD9YdvVwC/fXdCs7b14eLj8XTG3nQ98G7gwfEzPETz3PfFfwKaYtg8GvgXM7+Q12DZvV+s21g8I3hslYbsvtrs9A1gf81xsiLmfo4Dbgc8BI4BfA4/EflgQbPg+CBwEzATaf+OK5/LwMh+YBhQBv4gz737rKsm29mNmhcCTBNupUcAlwM3WyZePOO2MAf4GfMfdH+1Brq4eI+y/jS4CNre7PQN4od02p82fgI0Er/mPAj82s1Pd/cWY+e8i5n3p7hvo2neA4wleg3OAYwlfA2Z2LPB74OsE24j3Aevc/b/avd7aPkcOWOdxPs86YsCPYrZ97WUAd8fZJtwIPAgMjbNeE/Ey8EEzu97MTmr3Huk8ePB+nkew/u8i2Pb1WEqKCTMzghfl92OmjSVYuZ9392p3b3L3fyTQ3MeAv7j7k+7eRLDC8wk+vLpS7u73hcvdBOQRvOBw93vdfbO7t7r7PcAqghdgm63AurBiHgVMBl5p134jwYf2hWFxcxbwUOwM7n67u+9x9wbgOmBO27eCHsoJ77e9ZNZTZ44n2Pjc4O6N7v408GfgkvAD7wrgy+6+yd1b3P2F8LEmxIJvmCcAdyQw+/fcvSF83fwFuBjA3Re6+xvhc7mUYIP1/nCZS4G/u/ufwtdclbsvSTQf8Ad3X+bue4HvARebWSbwSeAxd38svN8ngVeBs2OWzafj5wqCD8bvuPvGmNfGR2O+9bQVyx0t/zngJ+6+3N2bCXZrHmExeycSYWYfInjPxx6ytPBvIoc8u7NuDcgk/jYmj/jr6rPAr9395fA1dgfBrtjjY+b5hbtXuPtO4EcEH8aJuBS4yd3XuHstQSH18fbfPuOsqx61FceHCD7gfuvuze6+GLif4AM3UcUERf9d7v777uZK8DEmosNtlJlNBE4Gvunu9eFr5TbgU0neHwSP8T/cfZu7byf4gtjW7pXA7eG2sTXcVr2daMMdfZ51orP3PMTffsN77xGLc3uX3P05gi8ZRxFsI6vM7KZwm9WVTwNL3f0tgm3ooWZ2ZE+zpGrPxMUE3zSfjpk2Edjp7tXdbGscsL7tiru3AhUE31C7UtFuubaKGDP7tL2327QGmE3wzTfWbQR7Gy4nqGw7chvBi/V84K/EvFDMLNPMbgh3q+0G1oU3tb+f7igh+BbbXjLrCeB/Y9bFQ+3arQjba7M+bHckwYfA6kTDd+A/CT6km7qYrzr8QI/N0PZcHmdmz5jZdjPbRbDHpm0dT0wyX0XM/+uB7LDtycBFbessXG8nA7F7t8YQ7L3qyGTgwZhllwMtwOjw9rZDHh0915OBn8Usu5NgAxT7XC+Ouf1rHbSRAfyEYE/Su9x9OcE3uufMrJZ2xXE73Vm33yb4VrwvzHR8u9u7Wlf/3m5dTyR8/kPtn6fY28a1Wzb2vvd734T/Z/He8wBx1lUHEmkrnsnAce1yXkqwXtp8Lea2xR208R9ALXBqzJ6tRHMl+hgT0dk2aqfvv8u9bVuSiOPbrZ/9nmMOfIxttye7Dejo8yyezl7HEH/dAHwR+DBQ38HjS5i7P+7u54b3dR7B51eHnTXb+TThHlB33wz8g/33zndLKoqJbILd1t9sN70CKDGz4m62t5ngjQa8WyVOpOtdcYTztS2XAUwANoff4P6P4Mkb4e7FwDIOrAgfJ+jlfBnBIZoDuPsygkM33yUoLGJ9guDJPI3gcMqUtjgJZD9AuPdjMrCyg5uTWU8A/+bB4aZigsIott2J7TZOk8J2dwD1BLuWe+IDBB/MCxKYd3i4Kzg2Q9tuwD8CjwAT3X0YwTG/tnVckUQ+iHkNhffZRPC4Kwj2WhTHXArd/YaY+Y8EXo/TbgVwVrvl89y97fmaCVSG3yQ7WvZz7ZbNd/cXYuY5Kub5vLGDNi4HVrj7Sx3ctoDgm/9s9n8tdJQjoXXr7qsJ1sWvw0zt77erdfWjdo+3wN1jD+20f55idxFvjl223X3v974Jl20m2DPZ5nLir6tYibQVTwXwj3aPscjd/yVmnhtjHsNRHbSxgKCghWDb1p1cl5PYY0zETOJvo0rMbEi7LIluo15q9zzu9xxz4GNsuz2ZbUC8z7MDhIeEZxP/dQzx1w3uvoigCPpOB4+v28K9ME8RFEGzO5vXgp8DzwC+ZUEfvy3AcQR7oBP9YcZ+UlFMfIrgeNnS2InuXknw4XyzmQ234DfN70ugvQXAOWZ2avhk/TvBhu6FzhcDYK6ZXRiujK+Ey70EFAJOWEGa2WfoYGW7ewvBN+c7w92n8fyYYHfvm+2mDwnvs4qg4Oiov0BCLOhQ9n3gHXfv6MWYzHrqzMsEfRK+ET5n8wiOo98d7q24HbjJgo5VmeFhoUSP010HfN094fPeX29mOWZ2CsFu4XvD6UMIvvHUh8dHPxGzzF3AaWZ2sZllmdkIMzsiwfsD+KQFHWsLCL753Re+Lu4EzjWzD4aPO8+Czn4TAMzsDIJvKY/HafcW4EdthybMrNTMzgv/HwlcS/y9ArcQvOkPDecfZmYXdeMxQXCM+VtxbvsV8P/cfV0XbSS8bs3seILC5ID7NLO24+fx+n38H/D5cA+UWfDztXPafSj9q5lNsKAT67eBe7rI3uZPwFfNbKqZFRG8R+8JDx+16WxddbeteP4MzDSzT4Xvs2wzO8ZiOpsn4PnwPXkF8H0zm9aNXIk+xk6Z2UkEz/PD7W9z9wqC7dFPwvfL4QR7dbvqR5aIPwHfDd9HIwm2lW0dun8DfCbcNmaY2XgL+gYlosPPszg+A2whONy5n/B1ex5wNHG2CRZ0uJ1E2JcwAVnhemy7ZFvQ0fTj4WeshdvD93Ng8d7eZQR9dg4h6HdyBMFnYgEd9/3oUiqKieEEu6078imCb3ZvA9sIPuA75e4rCI5P/5zgG+G5BB1lOjsu1eZhgr4E1eF9Xxge230L+G+CTmBbgcOAf8a5/9+6+0+6yPhnd7+mg5t+T1BpbgLeousntDPfJej/0OEx1CTXU1zh8h8meEHtAG4GPh1zzPFrwBvAIoLd7f9J4q+j19x9YYLzbiF4HjcTbHw+H5PhC8B/mNkego3Iu3s6POi8dTZBcbWToINgRx0t4/kD8Lvw/vMIOk62bRjPI/jg2k7w7efrQEZY7DxOUORsseBwQVuh2dYp7mcEe1OeCHO/RPBNAOBugtfltR0FcvcHCdbz3RYcPltG99/wf3b3Ve0nmtknCIqgn3bVQKLrNixu/4+gb83uDppaR7CH6q8W9q4n2Kg+Gt7PqwT9Jn5B8Bp4h+CbdKw/EvQXWBNeOvw1QgduJ3iOnwXWEuxp+1K7eTpcVz1sa50Fv0LYCFwAXGNmF4W7/s8APk7wGt9C8Bwn3IGuTfhl4wbgtnAPZSofY1xmdghB36evufvLcWa7hGAP7WaCzoY/8KC/UbJ+SPAhvpRge7Q4nIa7v0LwQf8/wC6C3feJ9i/q7PPsXRb8uuzXwFRgT/gafpzgENstwJlhnkvDbUf75YeH+T6bYPEJQdFfF3P5LcH747MEfQB3ExRU/8/d4xZs4RfVi4Gfu/uWmMtagtdNjw51WOJfEtObBT+5mu7un4w6iyQn3Btyp7tP6OP7XUiCv6lut9w84HJ3v7yD2/7u7qe1nz6Ymdk6d5/SwfSE1pUFP129yvvh2Dfhdmqdu/8u4iiSBAt+ajzF3a9rN30C8MOOtgUDXY+OjYjIfhoIvql3pLPOWYNVZZzpg2FdrSHYCyH9216CPQHtNRN/WzCgqZgQSZK7v8iB4yi03ZboTxYHDXc/Ic70Ab+ufP+fcEo/5e73xpm+BejoEPiAN2AOc4iIiEg0dNZQERERSYoOc6SR4uJinz59etczRmzv3r0UFhZ2PWPElDO1lDO1lDM1ysvLd7h7addzSm9SMZFGRo8ezauvHvCT5bSzcOFC5s2bF3WMLilnailnailnapjZ+q7nkt6mwxwiIiKSFBUTIiIikhQVEyIiIpIUFRMiIiKSFBUTIiIikhQVEyIiIpIUFRMiIiKSFBUTIiIikhQVEyIiIpIUFRPSoYmTJmNmHV7Ky8vj3hbvMnHS5KgfkoiI9BINpy0d2lixgZueWNHhbePr18a9LZ5rzihLRSwREUlD2jMhIiIiSdGeCekbloGZvXc9M5v8aXPJHT+LrOIxZOTk09pYR8vu7TRUrqR+3RJa63Z32uSEiZOo2KBz/IiIRE3FhPQNb+WmJ1bQ0NTCovXVvLFpF43NrWSaMawgm5zMDBqbW9ld30Rzq2MGk0oKmDOhmCkjCvYvREI6dCIikh5UTEifWbO9lieXb6W+qZWZo4o4dPwwxhXnkZXx3tG21lZne20Dq7fXsrxyD4+8vpnSolxOmj6CySMKI0wvIiLxqJiQXufuFJ/yKR5dWsmoIblceORoSofkdjhvRoYxemgeo4fmcdzUEazcuoeX1lTx0JLNHDxmCO+fWUpedmYfPwIREemMignpVe7OwhXbGXbixzh03FDmlZXutyeiM5kZxqyxQ5kxuohX11WzaN1ONuzcx6kHj2JaaVEvJxcRkUTp1xxJMrMyM1sSc9ltZl8xsxIze9LMVoV/h0edNQovrqli6aZd7Hr5fk49eFTChUSsrIwMjp82go8fM4mCnEweXVrJc6u2Q0ZWp2NbdHc8DI2FISLSM9ozkSR3XwEcAWBmmcAm4EHgWuApd7/BzK4Nr38zqpxReKtyN4vWVTN73FD+svC32LevTaq90iG5fPyYSTy3ajuLN9Qw6qIf8OVPf4T8OIc9ujsehjp0ioj0jPZMpNapwGp3Xw+cB9wRTr8DOD+qUFGoqm3g6be3MWF4PvPKRqWs3cwMY17ZKE6bNYq8CbO5+5UN7NzbmLL2RUSk+8zdo84wYJjZ7cBid/+FmdW4e3HMbdXufsChDjO7GrgaoLS0dO6CBQv6LG9nysvLmThzdoe3Zbc20JTRcQdKgOZW5+dLW9jdAF89MpOhOUbFymVx2+upRW++w+N7p9DqcMUhmUwasv/PR7vK2V7FymXMnTs3pRkTUVtbS1FR+vcBUc7UUs7UmD9/frm7Hx11jsFOxUSKmFkOsBk41N23JlpMxCorK/MVK7o3THVvMbNOh9PelDc17rIvr6nipbU7Offwse92lLzmjLJuD8HdlWvOKOP7D73BQ0s2s6+xmXMOG7vfz0e7ytlRe1G8HxYuXMi8efP6/H67SzlTSzlTw8xUTKQBHeZInbMI9kpsDa9vNbOxAOHfbZEl60M1+xpZtL6amaOK+uQXF8UFOVw0dwLD8rN55PXNvLOtttfvU0RE9qdiInUuAf4Uc/0R4LLw/8uAh/s8UQT+sXI7mWacMrO0z+6zMDeLj86dwOiheTy+rFIFhYhIH1MxkQJmVgCcDjwQM/kG4HQzWxXedkMU2frSxup9rKvaxzFTh1OU27c/FMrNyuS8I8apoBARiYB+GpoC7r4PGNFuWhXBrzsGBXfnhdVVFOVmccSE4kgytBUUDy/ZzOPLKikpy6BkfCRRREQGFe2ZkJRYV7WPyl31HDe1hKzM6F5WsXso7lrRqj0UIiJ9QMWEpMSidTsZkpfFrLFDo47ybkExsQgeX1bJmu0qKEREepOKCUnapuo6KnfVM3fScDIzDjxVeBRyszK58pBMSofk8tgbW1hftTfqSCIiA5aKCUnaq+t3kp+dySHjot8rESsvyzj/iPGUFObw6NJKKnbuizqSiMiApGJCklK9r5F1Vfs4fMIwsiPsKxFPXnYmFxw5nuJwHIpNNXVRRxIRGXDSb+sv/cobG3eRYXDY+GFRR4krPycoKIbkZfHIks1s2VUfdSQRkQFFxYT0WFNLK29V7uag0iIK+3hcie4qzM3iwiMnkJ+TyYNLNrFttwoKEZFUUTEhPbZy6x4amluZE9G4Et1VlJfFhUeNJzcrgweXbGJHbUPUkUREBgQVE9Jjb23ezfCCbMYV50UdJWFD87K58MjxZGVk8MDiTTp9uYhICqiYkB6p3tfI5l31HDJ2KGbp8XPQRBUX5HDhkeMxgwcWb6RmnwoKEZFkqJiQHlleuRsDDk6DQap6YnhhUFC0Oty/eBO765qijiQi0m+pmJBua3VneeUeJo0o6PMTeqXSiKJcLjhyPE0trdy/eCOZQ0Z0vZCIiBxAxYR027rdUNvQzKwx/XOvRKzSIbmcf+R46ptaGf3xH+tXHiIiPaBiQrrt9R2tZGUYU0cWRh0lJcYMzeO8I8aRWVTCpbe9zLY9KihERLpDxYR0S0urs3SHM3VkITlZA+flM644n233Xc+mmjouvuVFNlZr6G0RkUQNnE8D6RMbq/extxnKxgyJOkrKNVQs4w9XHkfV3kYuvuVF1u7QycFERBKhYkK6ZdW2WnIzYXJJQdRResXcycO5++rjaWhu5aJbXuTtLbujjiQikvZUTEjCWt1Zs30vBw83stLwpF6pcui4YdzzuRPIyjA+9uuXWFJRE3UkEZG0NnA/ESTlKmvqqWtqYfaI/jVIVU9MH1XEvZ8/gWH52Vxy60s8s2Jb1JFERNKWiokUMLNiM7vPzN42s+VmdoKZlZjZk2a2Kvw7POqcyXpney2ZGUZZ8cAvJgAmlhRw3+dPYOrIQq6641XufbUi6kgiImlJxURq/Az4q7sfDMwBlgPXAk+5+wzgqfB6v+XurN5ey6SSAvKyBkcxATBqaB73fO54Tpg2gq/ft5RfPL0Kd486lohIWlExkSQzGwq8D/gNgLs3unsNcB5wRzjbHcD5UeRLlaq9jeypb2baABlbojuG5GVz++XHcMGR47nxiZV87+FltLSqoBARaWP6lpUcMzsCuBV4i2CvRDnwZWCTuxfHzFft7gcc6jCzq4GrAUpLS+cuWLCgD1J3rby8nIkzZ797feHGVh5b38p3js5kZHYjTRm53WqvYuWy/dpLha7azG5t6FbOipXLmDt3btzbW925b2UTj61t4qhRmXx+Ti45mcnvpamtraWoqCjpdnqbcqaWcqbG/Pnzy9396KhzDHYqJpJkZkcDLwEnufvLZvYzYDfwpUSKiVhlZWW+YsWKXs2bKDPjpifey3J/+Ubqm1u49LjJjK9fy6a8qd1q75ozyvZrLxW6arO7Oa85oyyhQxi/++darv/zWxw1aTi3ffpohhfmJHwfHVm4cCHz5s1Lqo2+oJyppZypYWYqJtKADnMkbyOw0d1fDq/fBxwFbDWzsQDh3377c4CG5hY276pj8ojBd4ijI5efNJVffuIo3ti0i4/c8gIVOzVapogMbiomkuTuW4AKMysLJ51KcMjjEeCycNplwMMRxEuJip11tDpMHejFhGVgZgldzjl8HBvu+DqrNmzhxO8/QO6Y6QfMM3HS5KgfkYhIn+i/549OL18C7jKzHGAN8BmCQm2BmV0JbAAuijBfUtZV7SUnM4Mxw/KijtK7vLXbh2J27m3koSWbyLvyfzn7sLFMiSm4rjmjrJMlRUQGDhUTKeDuS4COjtmd2sdRUs7dWVe1l0kjCsjMGDw/CU1USWEOHzt6Ig8v2cwjr2/m1INHcei4YVHHEhHpUzrMIZ3aUdvI3oYWpowYmOfiSIXC3Cw+Mnc8E4cX8Pfl23h5TZXGohCRQUV7JqRT66qCM2eq82XncrMy+fCccTz19lZeWruT2oZmMNXqIjI4qJiQTq2v2kdpUS5FuXqpdCUzwzh91miG5GbzyrqdlF7wbeqbWsjLzow6mohIr9JXJ4nrvZ+E6hBHosyMEw4awbyyUgpmHM8Vv1vE3obmqGOJiPQqFRMS16aaOtxhUomKie6aM6GYHY/eyMtrd3LpbS9Ts68x6kgiIr1GxYTEtbG6jswMY+xA/0loL9n71kJuvvQo3tq8m4/f+hLb9tRHHUlEpFeomJC4Nu6sY+ywPLIy9TLpqQ8eOobffuYYNuzcx8W3vEjlrrqoI4mIpJw+JaRDGXlD2F7bwITh+VFH6fdOmj6SP1x5HFW1jXz81pfYskt7KERkYFExIR3KnRScjXPicPWXSIW5k4dzx5XHhgXFiyooRGRAUTEhHcqbNIesDGP0UPWXSJWjJg3njiuOZUdtI5f830ts3a2CQkQGBhUT0qG8yYcxvjhfQ2in2NzJw7njimPYtrueS25VQSEiA4OKCTnAtj315IyczIQS9ZfoDXMnl/D7K49l6+56Pnnby9Q2auhtEenfVEzIAV5asxOACeov0WvmTi7htsuOYf3OfdxUXq+BrUSkX1MxIQd4cfUOWutrGVWUG3WU/s0yMLO4lxOnj2TjPdezdlcL0z79Eywru9P5zYyJkyZH/ahERA6gEy7IAV5YXUV9xTIyMo6MOkr/5q3c9MSKLmer3LCaBRzFaf/1d86cPYYMi99P5ZozylKZUEQkJbRnQvZTuauO9VX7qN+wNOoog8bRozI4ZcZIVm2r5Zm3t+n05SLS72jPhOznlbVBf4mGijcjTjK4HDVpOPVNLSxaV82QvGyOnVoSdSQRkYSpmJD9LFq3k8KcTBq3rY06yqBzwrQR7Klv5sU1VQzLz6ZszJCoI4mIJESHOWQ/r66r5qjJw8Fbo44y6JgZp84axbhheTy5fKvO4yEi/YaKiRQws3Vm9oaZLTGzV8NpJWb2pJmtCv8OjzpnV3bta2LF1j0cM0W72KOSlZHBhw4fR1FuFo++XsmuuqaoI4mIdEnFROrMd/cj3P3o8Pq1wFPuPgN4Krye1so37MQdFRMRy8/J5MNzxtHqziOvb6ahuSXqSCIinVIx0XvOA+4I/78DOD+6KIl5ZW012ZnGEROLo44y6JUU5nDOYWOp2dfI429soVW/8BCRNGb6GVryzGwtUA048Gt3v9XMaty9OGaeanc/4FCHmV0NXA1QWlo6d8GCBX2U+kA/eqmOVofvnZBPeXk5E2fO7nC+7NYGmjK6N6BVxcplcdvrqa7a7G7OVGdMtL3Ocr60pZUHVrfygQnGmZMzqVi5jLlz56YsY3fU1tZSVFQUyX13h3KmVrrnnD9/fnnMHmGJiIqJFDCzce6+2cxGAU8CXwIeSaSYiFVWVuYrVnQ9yFFvqG9q4fDrnuDyk6bw7bNnYWZxB1waX7+WTXlTu9X+NWeUJTSAUyrb7G7OVGdMtL2ucv59+Vbe3Lybcw4by82fnBvZOBQLFy5k3rx5kdx3dyhnaqV7TjNTMZEGdJgjBdx9c/h3G/AgcCyw1czGAoR/t0WXsGtLN+6isaWVoyenfT/RQWfezFJGD83lybe2klUyIeo4IiIHUDGRJDMrNLMhbf8DZwDLgEeAy8LZLgMejiZhYhatCwarOlqdL9NOVmYG5xw2lswMo/SCb5ORk9flOTwSvehcHyKSChq0KnmjgQctOJ9CFvBHd/+rmS0CFpjZlcAG4KIIM3Zp0bqdTB9VRElhTtRRpAND8rI5c/YYHmhs4qwbn+S0WaNT0q7O9SEiqaBiIknuvgaY08H0KuDUvk/UfS2tTvm6aj40Z1zUUaQTk0oK2P3ivbx54seYOLxAI2SKSNrQYQ5h5dY97Glo5pgp6i+R7mqev4uxw/J4+u1t1OxrjDqOiAigYkKA8vXVAMxV58v0562cOXsMZvD4si20tOrXWCISPRUTwuIN1YwozGFSSUHUUSQBQ/OyOW3WaLbtaeCVsOOsiEiUVEwISzbUcOSk4YSdSKUfmD6qiIPHDGHRup1s2V0fdRwRGeRUTAxy1XsbWbNjL0dNLo46inTTvJmlFOZk8cSbW2hu0VleRSQ6KiYGudcqgv4SR01Sf4n+Jjc7k9NmjaJ6XxMvrK6KOo6IDGIqJga5xetryMwwDp8wLOoo0gOTRxRy+PhhvFZRQ+WuuqjjiMggpWJikFu8oZpZY4dQkKMhR/qrk6aPpCg3i6eWb9OvO0QkEiomBrGWVuf1ihod4ujncrIymH9wKVV7G9/9ma+ISF9SMTGIrdiyh72NLSomBoBpI4uYMaqIV9bupHqvBrMSkb6lYmIQW7xBnS8HkvfPLCUr03jq7W2RnaZcRAYnFROD2OIN1YwsymFiSX7UUSQFCnOzOHn6SDbV1LFiy56o44jIIKJiYhB7TYNVDTiHjhvK6KG5PPfODhqaW6KOIyKDhIqJkJmdlMi0gWLn3kbW7tirQxwDjJkxr2wU+xpbeGWthtoWkb6hYuI9P09w2oCw5N3BqoqjDSIpN2ZoHoeOG8qSihp2qjOmiPSBQT+4gJmdAJwIlJrZNTE3DQUyo0nV+xavryErwzh8QnHUUaQXnHjQCN7ZVsvCFdu44MjxOpQlIr1KeyYgBygiKKyGxFx2Ax+NMFevCgarGkp+zoCtlwa1gpwsjp82gorqOtbu2Bt1HBEZ4Ab9ngl3/wfwDzP7nbuvjzpPX2gbrOqjcydEHUV60WHjh/H6xhqef2cHU0YUkpGhvRMi0ju0Z+I9uWZ2q5k9YWZPt12iDtUb2garOlKdLwe0zAzj5Okjqd7XxJubd0cdR0QGsEG/ZyLGvcAtwG1At35TZ2aZwKvAJnf/kJmVAPcAU4B1wMXunjbjHGuwqsFj2shCxhXn8eKaKsrGDCEnS98fRCT1tGV5T7O7/8rdX3H38rZLgst+GVgec/1a4Cl3nwE8FV5PGxqsavAwM06ZXkpdU4vO2yEivUbFxHseNbMvmNlYMytpu3S1kJlNAM4h2KPR5jzgjvD/O4DzU542CUs0WNWgMmZYHjNHFbF4QzW1Dc1RxxGRAcg0hn/AzNZ2MNndfVoXy90H/ITgFyBfCw9z1Lh7ccw81e7e4TEFM7sauBqgtLR07oIFC3r6EBJS2+h88el9XDQzm3Om5cSdr7y8nIkzZ3d4W3ZrA00Zud2634qVy+K211NdtdndnKnOmGh73cnZ04xV9c6Ni1s4qtS4aMZ7v+CpWLmMuXPnJtRGbW0tRUVF3b7vvqacqZXuOefPn1/u7kdHnWOwUzGRBDP7EHC2u3/BzObRg2IiVllZma9YsaLX8gI88/Y2PvO7Rdx99fEcP21E3PnMjJue6DjL+Pq1bMqb2q37veaMsrjt9VRXbXY3Z6ozJtped3Imk/HZldtZUlHDJ46bxMii3HfbS3QbsHDhQubNm9ej++5Lypla6Z7TzFRMpAF1wAyZ2ac7mu7uv+9ksZOAD5vZ2UAeMNTM7gS2mtlYd680s7HAttQn7pnXNlSTmWEcPmFY1FGkjx07tYS3Knfzz3d2cN4R46OOIyIDiPpMvOeYmMspwHXAhztbwN2/5e4T3H0K8HHgaXf/JPAIcFk422XAw72UudsWb6jh4DFDKMhRHTnY5GVnMnfycNZV7WNzTV3UcURkAFExEXL3L8VcPgscSTA6Zk/cAJxuZquA08PrkWtpdZZU1HCkzscxaB0xsZiCnExeXF2V8OENEZGu6OtpfPuAGYnO7O4LgYXh/1XAqb2SKgmrt9dS29Cs8SUGsezMDI6ZUsI/Vm6nolp7J0QkNVRMhMzsUaDtq1omMAvo3Z9W9LHF4TgDGvlycJs9fijl66t5YfWOqKOIyAChYuI9N8b83wysd/eNUYXpDa9tqGF4QTZTRhREHUUilJWRwXFTS3jq7W3kTz826jgiMgCoz0QoPOHX2wTjRQwHGqNNlHqvVVRrsCoBYNbYoQzLz6b4lE/R2qq+EyKSHBUTITO7GHgFuAi4GHjZzAbMKch31zexalstR04sjjqKpIHMDOP4aSXkjJrKn9+ojDqOiPRzKibe8x3gGHe/zN0/DRwLfC/iTCnzekUN7uovIe8pGz2Exu3r+OmTK2luaY06joj0Yyom3pPh7rGDS1XRj9bPxEmTMbO4l3Mv/zfcW3nf7Emdztd2kYHPzKh59g+s2bGXBxZvijqOiPRj6oD5nr+a2d+AP4XXPwY8FmGebtlYsaHTYZYfWrKJ2vpmvvLnJQm1d80ZZSlKJums7p2XmTOxmJ89tYrzjhxHblZm1wuJiLTTb7559xYzm25mJ7n714FfA4cDc4AXgVsjDZci7s6WXfWMGZYXdRRJQ187Yyabauq4+5WKqKOISD816IsJ4KfAHgB3f8Ddr3H3rxLslfhphLlSpqauiYbmVsaqmJAOnDx9JMdNLeHnT7/DvkadolxEuk/FBExx96XtJ7r7q8CUvo+TepW76gEYM1TFhBzIzPj6B8vYUdvAHS+sjzqOiPRDKiaCs33Gk99nKXrRll315GRlUFLY01ONyEB39JQSPnDwKG75x2p21TVFHUdE+hkVE7DIzD7bfqKZXQmUR5An5bbsqmfM0Dz9SkM69e9nzGRXXRO3Pbcm6igi0s/o1xzwFeBBM7uU94qHownOGHpBVKFSpbG5lR21DRwztSTqKJLmDh03jA8dPpbfPL+Wy06cwsii3KgjiUg/Mej3TLj7Vnc/EbgeWBdernf3E9x9S5TZUmHbnnocGKv+EpKAa06fSUNzKzc/szrqKCLSj2jPRMjdnwGeiTpHqr3b+VK/5JAETCst4qNHTeDOl9Zz5SlTGV88ILoNiUgvG/R7Jga6LbvqGV6QTV62BiOSxPzbaTMA+N+/r4o4iYj0FyomBjB3p1KDVUk3jS/O55PHT+a+xRtZvb026jgi0g+omBjAdtc3U9fUwtih2lUt3fOF+QeRm5XB/zy5MuooItIPqJgYwCp31QHqLyHdN7IolytPnsqfl1by5uZdUccRkTSnYiJJZpZnZq+Y2etm9qaZXR9OLzGzJ81sVfi3z8/9vWVXPdmZxggNViU9cNUp0xiWn82Nf4t/AjkREVAxkQoNwAfcfQ5wBHCmmR0PXAs85e4zgKfC632qclc9o4fmkZGhwaqk+4blZ/Mv8w7imRXbeWH1jqjjiEgaUzGRJA+09VLLDi8OnAfcEU6/Azi/L3M1tQSDVenkXpKMy0+cwvjifH70l+W0ukcdR0TSlLk2EEkzs0yC0TOnA79092+aWY27F8fMU+3uBxzqMLOrgasBSktL5y5YsKBHGcrLy5k4c/a719+paeXWN1v5zKwMZpV0v2asWLlsv/ZiZbc20JTRvdERO2uvp7pqs7s5U50x0fa6k7M3Ms6dO7fTeV7c3MyvlzbwqRnOqQcVpey+e0ttbS1FRcqZKumec/78+eXufnTUOQY7FRMpZGbFwIPAl4DnEykmYpWVlfmKFT07Pm1m3PTEe8u+snYnL66p4nPvm9ajMSauOaNsv/Zija9fy6a8qSlrr6e6arO7OVOdMdH2upOzNzJ2tQ1obXUuuPmfbNi+mxe+80Hyc9J7zJKFCxcyb968qGN0STlTw8xUTKQBHeZIIXevARYCZwJbzWwsQPh3W19m2byrjhGFORqsSpKWkWF855xDqG5wfvO8TgImIgdSMZEkMysN90hgZvnAacDbwCPAZeFslwEP91WmVncqa+oZW6z+EpIax04tYe7oTG5euJot4RDtIiJtVEwkbyzwjJktBRYBT7r7n4EbgNPNbBVweni9T1TVNtLY0sr4YRqsSlLnY2U5NLc6P35sedRRRCTN6ERfSXL3pcCRHUyvAk7t+0TvDVY1VidpkhQaVZDB599/EP/71CouOXYSJxw0IupIIpImtGdiANpcU09hTiZD81QrSmp9Yd5BTBiez/cfXkZTS2vUcUQkTaiYGIA276pjXHE+ZhqsSlIrLzuTH5x7KKu21XLHC+uijiMiaULFxACzp76JPfXNGqxKes1ps0Yxv6yUn/59FZtr6qKOIyJpQMXEAFMZ9rQfp/4S0kvMjOs/PJuWVuc7D77R5TgVIjLwqZgYYDbX1JGdaZQWdW+ESpHumDSigG+cWcYzK7bz4Guboo4jIhFTMTHA6ORe0lcuO2EKcycP5/pH32LbHo09ITKYqZgYQBqaW9i+p0GHOKRPZGQY//mRw6lrauH7D72pwx0ig5iKiQFkc009DkxQMSF9ZPqoIr562kz++uYW7l+swx0ig5WKiQFkU3UdmWb6JYckzjIws4Qu5eXlHU7/wgdmUr/hDa656yUmHnpM1I9IRCKgUY0GkI01+xg9LJesTNWIkiBvTfgspOPr18add099E398eQO7jvkkDc0t5GbpBHMig4k+dQYIy8ln2+4GJhQXRB1FBqEhedmcdshocsdM57/+mtpTzYtI+lMxMUDkTjgEB8YPV38JicZBpUXsLn+U3zy/lsfeqIw6joj0IRUTA0TexMPIMNRfQiJV/cxvOGpSMf++4HXe3Lwr6jgi0kdUTAwQeZNmM3poHtnqLyFRamnmlk/Npbggm6t/X86O2oaoE4lIH9AnzwBQ29BMzpgZTNAhDkkDo4bkceunjmZHbQP/cmc5Dc0tUUcSkV6mYmIAeHXdTiwjk/EaX0LSxGEThvH/LprDonXVfPWeJbS0akArkYFMPw0dAF5euxNvadbIl5JWPjxnHNt21/PDvyxnSO4b3PCRwzDTMO8iA5GKiQHgpTVVNFSuJDtzVtRRRPZz1SnT2FXXxM+ffodhBdl866yDVVCIDEAqJvq5fY3NLN24i4aKZcB5UccROcA1p89kV10Ttz67hswM4xsfLFNBITLAqM9Eksxsopk9Y2bLzexNM/tyOL3EzJ40s1Xh3+G9cf/52Zks/No89rz2l95oXiRpZsZ15x7KJcdO4lcLV3P9o2/Rqj4UIgOKionkNQP/7u6zgOOBfzWzQ4BrgafcfQbwVHg95cyMiSUFtOyp6o3mRVIiI8P48QWzufLkqfzuhXVc+8BSdcoUGUB0mCNJ7l4JVIb/7zGz5cB4gmMO88LZ7gAWAt+MIKJIWjAzvnvOLApzs/jfp1axc28TP/v4ERTmajMk0t+Zu74dpIqZTQGeBWYDG9y9OOa2anc/4FCHmV0NXA1QWlo6d8GCBT267/LycibOnN2jZTtSsXJZ3PayWxtoyshNWXs91VWb3c2Z6oyJttednFFlhMRyVqxcllBbS+uKebZ2NCOzGvjQ0I0UZTZ3OF9OTg6HHXZYQm22qa2tpaioqFvLREE5U2P+/Pnl7n501DkGOxUTKWJmRcA/gB+5+wNmVpNIMRGrrKzMV6zo2UmSzCzhsz8m4pozyuK2N75+LZvypqasvZ7qqs3u5kx1xkTb607OqDJCYjm7097aHXt5fFklOVkZnHv4OEYPPXAo+GvOKKO726iFCxcyb968bi0TBeVMDTNTMZEG1GciBcwsG7gfuMvdHwgnbzWzseHtY4FtUeUTSUdTRxZy0dyJZJhx76sbWbqxptuFg4ikBxUTSbLgN26/AZa7+00xNz0CXBb+fxnwcF9nE0l3pUNyueTYSUwoyeeZFdv521tbaWxujTqWiHSTionknQR8CviAmS0JL2cDNwCnm9kq4PTwuoi0k5+dyXlzxnHCtBGs2LKHe16tYOfexqhjiUg3qBt1ktz9eSDeCDyn9mUWkf7KzDh2agljhuXx12Vb+NMrG3jfjNKoY4lIgrRnQkTSxqSSAj5x7CTGFufx9IptlH7k+2zbUx91LBHpgooJEUkrRXlZXHDEeN4/s5S8yXM486fP8bc3t0QdS0Q6oWJCRNKOmXHExGK23PEVxhXn8bk/lPP1e19nT31T1NFEpAMqJkQkbTVVVfDAv5zEF+dP5/7FGznrZ8/xz3d2RB1LRNpRMSEiaS0nK4OvfbCMez9/AtmZGVx628t864Gl7NZeCpG0oWJCRPqFuZNLePzLp/C590/jnkUVnHHTszy1fGvUsUQEFRMi0o/kZWfyrbNm8dC/nkRxQTZX3vEqX777NY1LIRIxFRMi0u8cPqGYR754Ml89bSaPvVHJaTf9g/vLN2o4bpGIaNAqEUlflkEwYn182SMnU3LmF/n3vY3863/fyRVzCpk/f37c+SdMnETFhvWpTioyqKmYEJH05a0JnYXU3Xlz826ez5rD3TWtXHjzPzluagnZmQfufL3mjLLeSCoyqKmYEJF+z8yYPX4Y00oLeW3FOl5dX82KLXs48aARHDxmSJd7N0QkOeozISIDRkFOFhfPyOSjcydQkJPJE29t5e5FFWyqros6msiApmJCRAac8cX5fPyYiXzwkNHsa2zhvsUb+fPSzVTVNkQdTWRA0mEOERmQzIyDxw7loFFFvLahhlfX72T19r2MPO+bLK/czayxQ6OOKDJgaM+EiAxo2ZkZHDu1hM+cOJVjpgwnf+pczvrZc3zuD6/yxsZdUccTGRBUTIjIoJCfk8mJB41k0y1X8OVTZ/DC6irO/cXzfORXL/Dwkk00NrdGHVGk31IxISKDSmt9LV89fSb/vPYDfPecWVTVNvDlu5dw4g1PcePfVlCxc1/UEUX6HfWZEJFBaWheNledMo0rTprKc+/s4A8vruOXC9/hF8+8w1GTivnwnHGcc/g4SofkRh1VJO2pmBCRQS0jw3j/zFLeP7OUTTV1PLJkMw8v2cR1j77Ff/z5LU6aPpLTDxnNBw4exYThBVHHFUlLKiaSZGa3Ax8Ctrn77HBaCXAPMAVYB1zs7tVRZRSRGAkM0Q2QPXIShbPex9NVp/DcqvF8/+E3ady2lrp3XmHf6kU0Vq4EbyUzK5uW5u6fDv3GG2/scNhvDfct/ZGKieT9DvgF8PuYadcCT7n7DWZ2bXj9mxFkE5H2EhyiO1b1vkbWbt/L2uJ8No2eyrATP0Z+diZTRhbw7M3f4ns/vY3crMxutTm+fm2HOTTct/RHKiaS5O7PmtmUdpPPA+aF/98BLETFhEi/Nbwgh+GTczhq8nDqm1pYX7WPNTtqWbN9L6UXfJtbn13DhOEFTB1ZyNSRhQzLz446skifMp2yN3lhMfHnmMMcNe5eHHN7tbsPj7Ps1cDVAKWlpXMXLFjQowzl5eVMnDm7R8t2pGLlsrjtZbc20JTRvU5pnbXXU1212d2cqc6YaHvdyRlVRkgsZ5T52nSVM5UZW9xZ9OYaqoqmsHynsy0ctXt0PhwywjhiZAZjCzs+pBIvZ8XKZcydOzcl+VKhtraWoqKiqGPENX/+/HJ3PzrqHIOdiokUSKaYiFVWVuYrVnRv92vMfXR7121nrjmjLG574+vXsilvasra66mu2uxuzlRnTLS97uSMKiMkljPKfG26ytmbGWv2NbJ2x17W7tjLxpo63GFEYQ5lY4ZQNnoIQ2P2WMTLec0ZZaTTdnnhwoXMmzcv6hhxmZmKiTSgwxy9Y6uZjXX3SjMbC2yLOpCI9L7ighyOnJTDkZOGs6+xmVXbalmxZQ8vrK7ihdVVTBiez+EThnHQyPT9pi/SEyomescjwGXADeHfh6ONIyJ9rSAnizkTipkzoZhddU2s2LKHZZt38dgbWyjKzeKEUa1MntxMYa42w9L/6VWcJDP7E0Fny5FmthH4AUERscDMrgQ2ABdFl1BEojYsP5tjp5Zw9JThrNuxl6Ubd/FkxT4yNq5l1tihzJ08nOEFOVHHFOkxFRNJcvdL4tx0ap8GEZG0l2HGtNIippUWkVO9hr9tK+LNzbt5c/NuZowq4pgpJVFHFOkRFRMiIhEozTfml43i2CklLKmoYenGXazaVkvpR3/AkooajphYHHVEkYTpRF8iIhEqzM3ipOkjueKkKZwwbQS5Y2dy/i//yeW/fYXXNmjgXOkfVEyIiKSB3OxMjp1awqZfX8U3zizj9YoaLrj5BS67/RUWq6iQNKdiQkQkjXhjHV+YN53nv/kBvnnmwbyxaRcX3vwCn779FcrXq6iQ9KRiQkQkDRXmZvEv8w7iuW/M51tnHcyyTbv4yK9e4FO/eZny9TujjieyHxUTIiJprDA3i8+9/yCe/+Z8vn32wSyv3M1HfvUin7ztZRatU1Eh6UHFhIhIP1CQk8XV7zuIZ78xn++cPYu3t+zmolte5NLbXuKVtSoqJFoqJkRE+pGCnCw++75pPPeND/Ddc2axYkstF//6Rc7/5T+599UK6hpboo4og5CKCRGRfig/J5OrTpnGc9+Yz3XnHkJtQzNfv28px/3471z/6Jus2ron6ogyiGjQKhGRfiw/J5PLT5rKZSdO4ZW1O7nz5Q3c+dJ6fvvPdZSNHsLZh43l7MPGMGP0kKijygCmYkJEZAAwM46bNoLjpo1gR+0hPLJkM48vq+SnT63kf/6+khmjijh11mhOmj6CY6aUkJedGXVkGUBUTIiIDDAji3K54uSpXHHyVLburueYC6/mjVGHsLJyFrf8IwtvbqJh01vUr19Kw+a3aahciTfWddjWjTfeyPz58/ebNmHiJCo2rO+LhyL9hIoJEZEBbPTQPCqe+gM3PbGCxuZWNtXUUVG9j4riY9gxec6785UU5DB6WC6jh+QxsiiXEUU55GVnMr5+LTc9sWK/Nq85o6yvH4akORUTIiLpxDIws15pOicrg6kjC5k6shCA+qYWtu6uZ8vuerbubmDdjn0sr3yv42ZRbhbjC1ooGrqDkUU5jCzKpbggu1eySf+mYkJEJJ146wF7ApIVb09CXnYmk0cUMnlEUFy4O3sbWtixt4EdtQ1U1Taya/ceVm2optWDZcxg3FW3cPXvX2XG6CKmjypixqghHFRaRH6O+mEMViomREQECDpxFuVlUZSXxZSwwBhfX8eGnClU72ukqraRnXsbeebtf7J6exlPv72N5rDKMIMJw/OZXlrEjNFDmF5axPSw2Biap70ZA52KCRER6VRmhjGyKJeRRbkA3Pvwf/L0Qz+BjCyyh48le+QkskdMpHbERFaPnMTTJeOxrJx3l2/es4OmqgqadlTQtGND8H9VBa11uwF16BwIVEyIiEj3dHEoptWd3XVN7NzbGF6GUDVuPNX7jqKpxd+dLz87k5LCHJb//Z6+SC29SMWEiIikVIYZxQU5FBfkMK30venuzp6G5pgiI7jkjD4ourCSEhpOuxeZ2ZlmtsLM3jGza6POIyISJTNjaF42U0YUctSk4Zw2azQXHz2RrX/8ZtTRJEkqJnqJmWUCvwTOAg4BLjGzQ6JNJSIiknoqJnrPscA77r7G3RuBu4HzIs4kIiKScubuXc8l3WZmHwXOdPerwuufAo5z9y+2m+9q4Orw6mxgWZ8G7ZmRwI6oQyRAOVNLOVNLOVNjsruXdj2b9CZ1wOw9HQ1hd0Dl5u63ArcCmNmr7n50bwdLlnKmlnKmlnKmVn/JKdHSYY7esxGYGHN9ArA5oiwiIiK9RsVE71kEzDCzqWaWA3wceCTiTCIiIimnwxy9xN2bzeyLwN+ATOB2d3+zi8Vu7f1kKaGcqaWcqaWcqdVfckqE1AFTREREkqLDHCIiIpIUFRMiIiKSFBUTaaK/DL1tZuvM7A0zW2Jmr0adp42Z3W5m28xsWcy0EjN70sxWhX+HR5kxzNRRzuvMbFO4TpeY2dlRZgwzTTSzZ8xsuZm9aWZfDqen1TrtJGdarVMzyzOzV8zs9TDn9eH0dFuf8XKm1fqU9KM+E2kgHHp7JXA6wU9KFwGXuPtbkQbrgJmtA45297QaxMbM3gfUAr9399nhtP8Cdrr7DWGBNtzdIz0JQJyc1wG17n5jlNlimdlYYKy7LzazIUA5cD5wOWm0TjvJeTFptE7NzIBCd681s2zgeeDLwIWk1/qMl/NM0mh9SvrRnon0oKG3k+TuzwI7200+D7gj/P8Ogg+ZSMXJmXbcvdLdF4f/7wGWA+NJs3XaSc604oHa8Gp2eHHSb33GyynSKRUT6WE8UBFzfSNpuEEMOfCEmZWHQ4Gns9HuXgnBhw4wKuI8nfmimS0ND4NEfjgmlplNAY4EXiaN12m7nJBm69TMMs1sCbANeNLd03J9xskJabY+Jb2omEgPCQ29nSZOcvejCM6G+q/hbntJzq+Ag4AjgErgvyNNE8PMioD7ga+4++6o88TTQc60W6fu3uLuRxCMhnusmc2OOFKH4uRMu/Up6UXFRHroN0Nvu/vm8O824EGCQzTpamt4TL3t2Pq2iPN0yN23hhvwVuD/SJN1Gh4zvx+4y90fCCen3TrtKGe6rlMAd68BFhL0Q0i79dkmNmc6r09JDyom0kO/GHrbzArDTm6YWSFwBul9ltNHgMvC/y8DHo4wS1xtHyahC0iDdRp2xPsNsNzdb4q5Ka3Wabyc6bZOzazUzIrD//OB04C3Sb/12WHOdFufkn70a440Ef7U6qe8N/T2j6JNdCAzm0awNwKCodj/mC45zexPwDyC0yVvBX4APAQsACYBG4CL3D3Szo9xcs4j2H3swDrgc23H0aNiZicDzwFvAK3h5G8T9EdIm3XaSc5LSKN1amaHE3SwzCT4ErfA3f/DzEaQXuszXs4/kEbrU9KPigkRERFJig5ziIiISFJUTIiIiEhSVEyIiIhIUlRMiIiISFJUTIiIiEhSVEyIDCJmVtvBtDIzWxieDXK5md1qZh+MOUNkrQVntF1iZr8Pl7nAzNzMDg6vvxzevsHMtscsO6WPH6KIREA/DRUZRMys1t2L2k37G3Czuz8cXj/M3d+IuX0h8DV3fzVm2gJgLPCUu18XM/1ygrPKfrE3H4eIpBftmRCRsQRDugMQW0h0JDwPxknAlQSjtYrIIKdiQkT+B3jazB43s6+2DafcifOBv7r7SmCnmR3V2wFFJL2pmBAZ5Nz9t8As4F6Cob1fMrPcTha5BLg7/P/u8LqIDGJZUQcQkeiFZ4O9HbjdzJYBs4Hy9vOF55L4ADDbzJzgHA5uZt9wdcASGbS0Z0JkkDOzM8PTeGNmY4ARwKY4s38U+L27T3b3Ke4+EVgLnNw3aUUkHWnPhMjgUmBmG2Ou3wRMAH5mZvXhtK+7+5Y4y18C3NBu2v3AJwjO3ikig5B+GioiIiJJ0WEOERERSYqKCREREUmKigkRERFJiooJERERSYqKCREREUmKigkRERFJiooJERERScr/D5G1AxGfrHw/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.histplot(df_boston['LSTAT'], kde=True)\n",
    "plt.title(\"Гистограмма плотности распределения с ядерной оценкой плотности для LSTAT\")\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abfb2523",
   "metadata": {},
   "source": [
    "### Построение доверительных интервалов\n",
    "\n",
    "Предположим, что распределение данных нормальное. Построим односторонние и двусторонние доверительные интервалы надежности для математического ожидания и дисперсии"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ee15eb5f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def norm_conf_interval(array, type_='mean', alpha=0.05, side='both'):\n",
    "    \"\"\" Получение доверительного интервала\n",
    "    \n",
    "    Параметры\n",
    "    ---------\n",
    "    array : np.array\n",
    "      Список значений\n",
    "    type_ : str\n",
    "      Тип параметра (среднее или СКО)\n",
    "      Принимает значения mean или std\n",
    "    alpha : float\n",
    "      Уровень значимости\n",
    "    side : str\n",
    "      Сторона доверительного интервала.\n",
    "      Принимает значения both, left или rigth\n",
    "      \n",
    "    Результат\n",
    "    ---------\n",
    "    conf_interval : tuple\n",
    "    \"\"\"\n",
    "    \n",
    "    side = str(side).lower().strip()\n",
    "    type_ = str(type_).lower().strip()\n",
    "    \n",
    "    assert side in ('both', 'left', 'right')\n",
    "    assert 0 < alpha < 1\n",
    "    assert type_ in ('mean', 'std')\n",
    "    \n",
    "    if side == 'both':\n",
    "        betas = [1 - alpha/2]\n",
    "        if type_ == 'std':\n",
    "            betas.append(alpha/2)\n",
    "    else:\n",
    "        betas = [1 - alpha]\n",
    "        if type_ == 'std':\n",
    "            betas.append(alpha)\n",
    "        \n",
    "    if type_ == 'mean':\n",
    "        arr_mean = get_mean(array)\n",
    "        if side == 'both':\n",
    "            parameter1 = parameter2 = arr_mean\n",
    "        elif side == 'left':\n",
    "            parameter1, parameter2 = -np.inf, arr_mean\n",
    "        else:\n",
    "            parameter1, parameter2 = arr_mean, np.inf\n",
    "            \n",
    "        sem = get_std(array, square=False) / np.sqrt(len(array))\n",
    "        student_quantile = stats.t.ppf(betas[0], df=55)\n",
    "        delta1 = delta2 = sem * student_quantile\n",
    "        \n",
    "    if type_ == 'std':\n",
    "        \n",
    "        arr_std_squared = get_std(array, square=True)\n",
    "        \n",
    "        if side == 'both':\n",
    "            parameter1 = parameter2 = arr_std_squared\n",
    "        elif side == 'left':\n",
    "            parameter1, parameter2 = -np.inf, arr_std_squared\n",
    "        else:\n",
    "            parameter1, parameter2 = arr_std_squared, np.inf\n",
    "            \n",
    "        chi_quantile_1 = stats.chi2.ppf(betas[0], df=55)\n",
    "        chi_quantile_2 = stats.chi2.ppf(betas[1], df=55)\n",
    "        delta1 = arr_std_squared / chi_quantile_1\n",
    "        delta2 = arr_std_squared / chi_quantile_2\n",
    "        \n",
    "    return parameter1-delta1, parameter2+delta2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "302d587c",
   "metadata": {},
   "source": [
    "### Доверительные интервалы для уровня надежности 0.95"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d0fe46d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Двусторонний доверительный интервал для среднего: (12.016861376677113, 13.289265105536334)\n",
      "Левосторонний доверительный интервал для среднего: (-inf, 13.184182773655241)\n",
      "Правосторонний доверительный интервал для среднего: (12.121943708558206, inf)\n",
      "Двусторонний доверительный интервал для среднего: (50.33574616319592, 52.39578714204726)\n",
      "Левосторонний доверительный интервал для среднего: (-inf, 52.303726211112135)\n",
      "Правосторонний доверительный интервал для среднего: (50.29916926234373, inf)\n"
     ]
    }
   ],
   "source": [
    "alpha = 0.05\n",
    "\n",
    "print(\"Двусторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='mean', alpha=alpha, side='both'))\n",
    "\n",
    "print(\"Левосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='mean', alpha=alpha, side='left'))\n",
    "\n",
    "print(\"Правосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='mean', alpha=alpha, side='right'))\n",
    "\n",
    "print(\"Двусторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='std', alpha=alpha, side='both'))\n",
    "\n",
    "print(\"Левосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='std', alpha=alpha, side='left'))\n",
    "\n",
    "print(\"Правосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='std', alpha=alpha, side='right'))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "420d97fb",
   "metadata": {},
   "source": [
    "### Доверительные интервалы для уровня надежности 0.9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "cd6fdec2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Двусторонний доверительный интервал для среднего: (12.121943708558206, 13.184182773655241)\n",
      "Левосторонний доверительный интервал для среднего: (-inf, 13.064850077128071)\n",
      "Правосторонний доверительный интервал для среднего: (12.241276405085376, inf)\n",
      "Двусторонний доверительный интервал для среднего: (50.29916926234373, 52.303726211112135)\n",
      "Левосторонний доверительный интервал для среднего: (-inf, 52.20719926756874)\n",
      "Правосторонний доверительный интервал для среднего: (50.253515821657814, inf)\n"
     ]
    }
   ],
   "source": [
    "alpha = 0.1\n",
    "\n",
    "print(\"Двусторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='mean', alpha=alpha, side='both'))\n",
    "\n",
    "print(\"Левосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='mean', alpha=alpha, side='left'))\n",
    "\n",
    "print(\"Правосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='mean', alpha=alpha, side='right'))\n",
    "\n",
    "print(\"Двусторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='std', alpha=alpha, side='both'))\n",
    "\n",
    "print(\"Левосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='std', alpha=alpha, side='left'))\n",
    "\n",
    "print(\"Правосторонний доверительный интервал для среднего:\", \n",
    "      norm_conf_interval(df_boston['LSTAT'], type_='std', alpha=alpha, side='right'))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
